<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8">
  
  
  <title>Hexo</title>
  <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
  <meta name="description" content="第十章 Lambda表达式01_体验Lambda表达式 1.1、函数式编程思想概述  在数学中，函数就是有输入量、输出量的一套计算方案，也就是“拿数据做操作”。面向对象思想强调“必须通过对象的形式来做事情”。函数式思想则尽量忽略面向对象的复杂语法：“强调做什么，而不是以什么形式去做”。而我们要学习的Lambda表达式就是函数式思想的体现。   1.2、体验Lambda表达式  案例需求：  启动一">
<meta property="og:type" content="article">
<meta property="og:title" content="Hexo">
<meta property="og:url" content="https://goofyer.gitee.io/notes-on-computer-expertise/2021/12/20/Java/%E7%AC%AC%E5%8D%81%E7%AB%A0%20Lambda%E8%A1%A8%E8%BE%BE%E5%BC%8F/index.html">
<meta property="og:site_name" content="Hexo">
<meta property="og:description" content="第十章 Lambda表达式01_体验Lambda表达式 1.1、函数式编程思想概述  在数学中，函数就是有输入量、输出量的一套计算方案，也就是“拿数据做操作”。面向对象思想强调“必须通过对象的形式来做事情”。函数式思想则尽量忽略面向对象的复杂语法：“强调做什么，而不是以什么形式去做”。而我们要学习的Lambda表达式就是函数式思想的体现。   1.2、体验Lambda表达式  案例需求：  启动一">
<meta property="og:locale" content="en_US">
<meta property="article:published_time" content="2021-12-19T17:32:59.257Z">
<meta property="article:modified_time" content="2021-12-19T17:33:00.455Z">
<meta property="article:author" content="John Doe">
<meta name="twitter:card" content="summary">
  
    <link rel="alternate" href="/notes-on-computer-expertise/atom.xml" title="Hexo" type="application/atom+xml">
  
  
    <link rel="shortcut icon" href="/notes-on-computer-expertise/favicon.png">
  
  
    
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/typeface-source-code-pro@0.0.71/index.min.css">

  
  
<link rel="stylesheet" href="/notes-on-computer-expertise/css/style.css">

  
    
<link rel="stylesheet" href="/notes-on-computer-expertise/fancybox/jquery.fancybox.min.css">

  
<meta name="generator" content="Hexo 5.4.0"></head>

<body>
  <div id="container">
    <div id="wrap">
      <header id="header">
  <div id="banner"></div>
  <div id="header-outer" class="outer">
    <div id="header-title" class="inner">
      <h1 id="logo-wrap">
        <a href="/notes-on-computer-expertise/" id="logo">Hexo</a>
      </h1>
      
    </div>
    <div id="header-inner" class="inner">
      <nav id="main-nav">
        <a id="main-nav-toggle" class="nav-icon"></a>
        
          <a class="main-nav-link" href="/notes-on-computer-expertise/">Home</a>
        
          <a class="main-nav-link" href="/notes-on-computer-expertise/archives">Archives</a>
        
      </nav>
      <nav id="sub-nav">
        
          <a id="nav-rss-link" class="nav-icon" href="/notes-on-computer-expertise/atom.xml" title="RSS Feed"></a>
        
        <a id="nav-search-btn" class="nav-icon" title="Search"></a>
      </nav>
      <div id="search-form-wrap">
        <form action="//google.com/search" method="get" accept-charset="UTF-8" class="search-form"><input type="search" name="q" class="search-form-input" placeholder="Search"><button type="submit" class="search-form-submit">&#xF002;</button><input type="hidden" name="sitesearch" value="https://goofyer.gitee.io/notes-on-computer-expertise"></form>
      </div>
    </div>
  </div>
</header>

      <div class="outer">
        <section id="main"><article id="post-Java/第十章 Lambda表达式" class="h-entry article article-type-post" itemprop="blogPost" itemscope itemtype="https://schema.org/BlogPosting">
  <div class="article-meta">
    <a href="/notes-on-computer-expertise/2021/12/20/Java/%E7%AC%AC%E5%8D%81%E7%AB%A0%20Lambda%E8%A1%A8%E8%BE%BE%E5%BC%8F/" class="article-date">
  <time class="dt-published" datetime="2021-12-19T17:32:59.257Z" itemprop="datePublished">2021-12-20</time>
</a>
    
  </div>
  <div class="article-inner">
    
    
    <div class="e-content article-entry" itemprop="articleBody">
      
        <h2 id="第十章-Lambda表达式"><a href="#第十章-Lambda表达式" class="headerlink" title="第十章 Lambda表达式"></a>第十章 Lambda表达式</h2><h3 id="01-体验Lambda表达式"><a href="#01-体验Lambda表达式" class="headerlink" title="01_体验Lambda表达式"></a>01_体验Lambda表达式</h3><ul>
<li><p>1.1、函数式编程思想概述</p>
<ul>
<li>在数学中，函数就是有输入量、输出量的一套计算方案，也就是“拿数据做操作”。面向对象思想强调“必须通过对象的形式来做事情”。函数式思想则尽量忽略面向对象的复杂语法：“强调做什么，而不是以什么形式去做”。而我们要学习的Lambda表达式就是函数式思想的体现。</li>
</ul>
</li>
<li><p>1.2、体验Lambda表达式</p>
<ul>
<li><p>案例需求：</p>
<ul>
<li>启动一个线程，在控制台输出一句话：多线程程序启动了。</li>
</ul>
</li>
<li><p>实现方式1：</p>
<ul>
<li>定义一个类MyRunnable实现Runnable接口，重写run()方法</li>
<li>创建MyRunnable类的对象</li>
<li>创建Thread类的对象，把MyRunnable的对象作为构造参数传递</li>
<li>启动线程</li>
</ul>
</li>
<li><p>实现方式2：</p>
<ul>
<li>匿名内部类的方式改进</li>
</ul>
</li>
<li><p>实现方式3：</p>
<ul>
<li>Lambda表达式的方式改进</li>
</ul>
</li>
<li><p>代码如下</p>
<ul>
<li><p>public class MyRunnable implements  Runnable{<br>@Override<br>public void run() {<br>System.out.println(“多线程程序启动”);<br>}<br>}</p>
</li>
<li><p>public class LambdaDemo {<br>public static void main(String[]args)<br>{<br>//实现类的方法<br>MyRunnable my=new MyRunnable();<br>Thread t=new Thread(my);<br>t.start();</p>
<p>//匿名内部类<br>new Thread(new Runnable() {<br>  @Override<br>  public void run() {</p>
<pre><code>  System.out.println(&quot;多线程程序启动&quot;);
</code></pre><p>  }<br>}).start();<br>//lambda</p>
<p>new Thread(()-&gt;{<br>  System.out.println(“多线程程序启动”);<br>}).start();<br>}<br>}</p>
</li>
</ul>
</li>
</ul>
</li>
</ul>
<h3 id="02-Lambda表达式的标准格式"><a href="#02-Lambda表达式的标准格式" class="headerlink" title="02_Lambda表达式的标准格式"></a>02_Lambda表达式的标准格式</h3><ul>
<li><p>1.3、Lambda表达式的标准格式</p>
<ul>
<li>格式：(形式参数) -&gt; {代码块}</li>
<li>形式参数：如果有多个参数，参数之间用逗号隔开；如果没有参数，留空即可。</li>
<li>-&gt;：由英文中画线和大于符号组成，固定写法。代表指向动作。</li>
<li>代码块：是我们具体要做的事情，也就是以前我们写的方法体内容。</li>
</ul>
</li>
</ul>
<h3 id="03-Lambda表达式练习1-抽象方法无参无返回值"><a href="#03-Lambda表达式练习1-抽象方法无参无返回值" class="headerlink" title="03_Lambda表达式练习1(抽象方法无参无返回值)"></a>03_Lambda表达式练习1(抽象方法无参无返回值)</h3><ul>
<li><p>1.4、Lambda表达式的练习</p>
<ul>
<li><p>Lambda表达式的使用前提：</p>
<ul>
<li>有一个接口。</li>
<li>接口中有且仅有一个抽象方法。</li>
</ul>
</li>
<li><p>练习描述</p>
<ul>
<li>无参无返回值抽象方法的练习。</li>
</ul>
</li>
<li><p>练习1 操作步骤</p>
<ul>
<li>1.定义一个接口(Eatable)，里面定义一个抽象方法：void eat();</li>
<li><p>2.定义一个测试类(EatableDemo)，在测试类中提供两个方法：</p>
<ul>
<li>一个方法是：useEatable(Eatable e)</li>
<li>一个方法是主方法，在主方法中调用useEatable方法</li>
</ul>
</li>
</ul>
</li>
<li><p>代码</p>
<ul>
<li>public interface Eatable {<br>void eat();<br>}<br>public class EatableImpl implements Eatable{<br>@Override<br>public void eat() {<br>System.out.println(“一天一苹果”);<br>}<br>}<br>import java.sql.Statement;</li>
</ul>
</li>
</ul>
</li>
</ul>
<p>public class EatableDemo {<br>    public static void useEatable(Eatable e)<br>    {<br>        e.eat();<br>    }<br>    public static void main(String[]args) {<br>        //实现类的方法调用方法<br>        Eatable e=new EatableImpl();//多态<br>        useEatable(e);<br>        //匿名内部类<br>        useEatable(new Eatable() {<br>            @Override<br>            public void eat() {<br>                System.out.println(“一天一苹果”);<br>            }<br>        });<br>        //lambda</p>
<pre><code>    useEatable(()-&gt;&#123;
        System.out.println(&quot;一天一苹果&quot;);
    &#125;);
&#125;
</code></pre><p>}</p>
<h3 id="04-Lambda表达式练习2-抽象方法带参无返回值"><a href="#04-Lambda表达式练习2-抽象方法带参无返回值" class="headerlink" title="04_Lambda表达式练习2(抽象方法带参无返回值)"></a>04_Lambda表达式练习2(抽象方法带参无返回值)</h3><ul>
<li><p>练习描述</p>
<ul>
<li>有参无返回值抽象方法的练习。</li>
</ul>
</li>
<li><p>练习2 操作步骤</p>
<ul>
<li>1.定义一个接口(Flyable)，里面定义一个抽象方法：void fly(String s);</li>
<li><p>2.定义一个测试类(FlyableDemo)，在测试类中提供两个方法：</p>
<ul>
<li>一个方法是：useFlyable(Flyable f)</li>
<li>一个方法是主方法，在主方法中调用useFlyable方法</li>
</ul>
</li>
</ul>
</li>
<li><p>代码</p>
</li>
</ul>
<h3 id="05-Lambda表达式练习3-抽象方法带参带返回值"><a href="#05-Lambda表达式练习3-抽象方法带参带返回值" class="headerlink" title="05_Lambda表达式练习3(抽象方法带参带返回值)"></a>05_Lambda表达式练习3(抽象方法带参带返回值)</h3><ul>
<li><p>练习描述</p>
<ul>
<li>有参有返回值抽象方法的练习。</li>
</ul>
</li>
<li><p>练习3 操作步骤</p>
<ul>
<li>定义一个接口(Addable)，里面定义一个抽象方法：int add(int x,int y);</li>
<li><p>定义一个测试类(AddableDemo)，在测试类中提供两个方法：</p>
<ul>
<li>一个方法是：useAddable(Addable a)</li>
<li>一个方法是主方法，在主方法中调用useAddable方法</li>
</ul>
</li>
</ul>
</li>
<li><p>代码</p>
</li>
</ul>
<h3 id="06-Lambda表达式的省略模式"><a href="#06-Lambda表达式的省略模式" class="headerlink" title="06_Lambda表达式的省略模式"></a>06_Lambda表达式的省略模式</h3><ul>
<li>1.5、Lambda表达式的省略模式</li>
<li><p>省略的规则：</p>
<ul>
<li>参数类型可以省略。但是有多个参数的情况下，不能只省略一个。</li>
<li>如果参数有且仅有一个，那么小括号可以省略。</li>
<li>如果代码块的语句只有一条，可以省略大括号和分号，和return关键字。</li>
</ul>
</li>
<li><p>代码</p>
</li>
<li>子主题 4</li>
</ul>
<h3 id="07-Lambda表达式的注意事项"><a href="#07-Lambda表达式的注意事项" class="headerlink" title="07_Lambda表达式的注意事项"></a>07_Lambda表达式的注意事项</h3><ul>
<li>1.6、Lambda表达式的注意事项</li>
<li><p>注意事项：</p>
<ul>
<li>使用Lambda必须要有接口，并且要求接口中有且仅有一个抽象方法。</li>
<li>必须有上下文环境，才能推导出Lambda对应的接口。</li>
<li>根据局部变量的赋值得知Lambda对应的接口：Runnable r = () -&gt; System.out.println(“Lambda表达式”);</li>
<li>根据调用方法的参数得知Lambda对应的接口：new Thread(() -&gt; System.out.println(“Lambda表达式”)).start();</li>
</ul>
</li>
<li><p>代码</p>
<ul>
<li>子主题 1</li>
<li>子主题 2</li>
</ul>
</li>
</ul>
<h3 id="08-Lambda表达式和匿名内部类的区别"><a href="#08-Lambda表达式和匿名内部类的区别" class="headerlink" title="08_Lambda表达式和匿名内部类的区别"></a>08_Lambda表达式和匿名内部类的区别</h3><ul>
<li><p>1.7、Lambda表达式和匿名内部类的区别</p>
<ul>
<li><p>所需类型不同</p>
<ul>
<li>匿名内部类：可以是接口，也可以是抽象类，还可以是具体类。</li>
<li>Lambda表达式：只能是接口。</li>
</ul>
</li>
<li><p>使用限制不同</p>
<ul>
<li>如果接口中有且仅有一个抽象方法，可以使用Lambda表达式，也可以使用匿名内部类。</li>
<li>如果接口中多于一个抽象方法，只能使用匿名内部类，而不能使用Lambda表达式。</li>
</ul>
</li>
<li><p>实现原理不同</p>
<ul>
<li>匿名内部类：编译之后，产生一个单独的.class字节码文件。</li>
<li>Lambda表达式：编译之后，没有一个单独的.class字节码文件。对应的字节码会在运行的时候动态生成。</li>
</ul>
</li>
<li><p>子主题 4</p>
<ul>
<li>子主题 5</li>
<li>子主题 6</li>
<li>子主题 7</li>
<li>子主题 8</li>
<li>子主题 9</li>
<li>子主题 10</li>
<li>子主题 11</li>
<li>子主题 12</li>
</ul>
</li>
</ul>
</li>
</ul>
<h3 id="09-接口组成更新概述"><a href="#09-接口组成更新概述" class="headerlink" title="09_接口组成更新概述"></a>09_接口组成更新概述</h3><ul>
<li><p>常量</p>
<ul>
<li>public static final</li>
</ul>
</li>
<li><p>抽象方法</p>
<ul>
<li><p>public abstract</p>
<ul>
<li>子主题 1</li>
<li></li>
<li>子主题 1</li>
</ul>
</li>
<li><p>默认方法(Java 8)</p>
<ul>
<li><p>接口中默认方法的定义格式：</p>
<ul>
<li>格式：public default 返回值类型 方法名(参数列表) { }</li>
<li>范例：public default void show3() { }</li>
</ul>
</li>
<li><p>接口中默认方法的注意事项：</p>
<ul>
<li>默认方法不是抽象方法，所以不强制被重写。但是可以被重写，重写的时候去掉default关键字。</li>
<li>public可以省略，default不能省略。</li>
</ul>
</li>
<li><p>子主题 1</p>
</li>
</ul>
</li>
<li><p>静态方法(Java 8)</p>
</li>
<li>私有方法(Java 9)</li>
</ul>
</li>
</ul>
<h3 id="10-接口中默认方法"><a href="#10-接口中默认方法" class="headerlink" title="10_接口中默认方法"></a>10_接口中默认方法</h3><ul>
<li><p>1.2、接口中默认方法</p>
<ul>
<li><p>接口中默认方法的定义格式：</p>
<ul>
<li>格式：public default 返回值类型 方法名(参数列表) { }</li>
<li>范例：public default void show3() { }</li>
</ul>
</li>
<li><p>接口中默认方法的注意事项：</p>
<ul>
<li>默认方法不是抽象方法，所以不强制被重写。但是可以被重写，重写的时候去掉default关键字。</li>
<li>public可以省略，default不能省略。</li>
</ul>
</li>
</ul>
</li>
</ul>
<h3 id="11-接口中静态方法"><a href="#11-接口中静态方法" class="headerlink" title="11_接口中静态方法"></a>11_接口中静态方法</h3><ul>
<li><p>接口中静态方法的定义格式：</p>
<ul>
<li>格式：public static 返回值类型 方法名(参数列表) { }</li>
<li>范例：public static void show() { }</li>
</ul>
</li>
<li><p>接口中静态方法的注意事项：</p>
<ul>
<li>静态方法只能通过接口名调用，不能通过实现类名或者对象名调用。</li>
<li>public可以省略，static不能省略。</li>
</ul>
</li>
</ul>
<h3 id="12-接口中私有方法"><a href="#12-接口中私有方法" class="headerlink" title="12_接口中私有方法"></a>12_接口中私有方法</h3><ul>
<li><p>私有方法产生原因：</p>
<ul>
<li>Java 9中新增了带方法体的私有方法，这其实在Java 8中就埋下了伏笔：Java 8允许在接口中定义带方法体的默认方法和静态方法。这样可能会引发一个问题：当两个默认方法或者静态方法中包含一段相同的代码实现时，程序必然考虑将这段实现代码抽取成一个共性方法，而这个共性方法是不需要让别人使用的，因此用私有给隐藏起来，这就是Java 9增加私有方法的必然性。</li>
</ul>
</li>
<li><p>接口中私有方法的定义格式：</p>
<ul>
<li>格式1：private 返回值类型 方法名(参数列表) { }</li>
<li>范例1：private void show() { }</li>
<li>格式2：private static 返回值类型 方法名(参数列表) { }</li>
<li>范例2：private static void method() { }</li>
</ul>
</li>
<li><p>接口中私有方法的注意事项：</p>
<ul>
<li>默认方法可以调用私有的静态方法和非静态方法。</li>
<li>静态方法只能调用私有的静态方法。</li>
</ul>
</li>
</ul>
<h3 id="13-体验方法引用"><a href="#13-体验方法引用" class="headerlink" title="13_体验方法引用"></a>13_体验方法引用</h3><ul>
<li><p>方法引用的出现原因：</p>
<ul>
<li>在使用Lambda表达式的时候，我们实际上传递进去的代码就是一种解决方案：拿参数做操作。</li>
</ul>
</li>
<li><p>代码</p>
</li>
</ul>
<h3 id="14-方法引用符"><a href="#14-方法引用符" class="headerlink" title="14_方法引用符"></a>14_方法引用符</h3><ul>
<li><p>方法引用符：</p>
<ul>
<li>该符号为引用运算符，而它所在的表达式被称为方法引用。</li>
</ul>
</li>
<li><p>Lambda表达式：usePrintable(s -&gt; System.out.println(s));</p>
</li>
<li>分析：拿到参数s之后，通过Lambda表达式，传递给System.out.println方法去处理。</li>
<li>方法引用：usePrintable(System.out::println);</li>
<li>分析：直接使用System.out中的println方法来取代Lambda，代码更加的简洁。</li>
<li><p>推导与省略：</p>
<ul>
<li>如果使用Lambda，那么根据“可推导就是可省略”的原则，无需指定参数类型也无需指定的重载形式， 它们都将被自动推导。如果使用方法引用，也是同样可以根据上下文进行推导。方法引用是Lambda的孪生兄弟。</li>
</ul>
</li>
<li><p>子主题 7</p>
</li>
<li>子主题 8</li>
</ul>
<h3 id="15-引用类方法"><a href="#15-引用类方法" class="headerlink" title="15_引用类方法"></a>15_引用类方法</h3><ul>
<li><p>常见的引用方式：</p>
<ul>
<li>引用类方法</li>
<li>引用对象的实例方法</li>
<li>引用类的构造方法</li>
<li>引用构造器</li>
</ul>
</li>
<li><p>引用类方法，其实就是引用类的静态方法。</p>
<ul>
<li>格式：类名::静态方法</li>
<li>范例：Integer::parseInt</li>
<li>Integer类的方法：public static int parseInt(String s) 将此String转换为int类型数据</li>
</ul>
</li>
<li><p>练习描述：</p>
<ul>
<li><p>定义一个接口(Converter)，里面定义一个抽象方法。</p>
<ul>
<li>int convert(String s);</li>
</ul>
</li>
<li><p>定义一个测试类(ConverterDemo)，在测试类中提供两个方法。</p>
<ul>
<li>一个方法是：useConverter(Converter c)</li>
<li>一个方法是主方法，在主方法中调用useConverter方法</li>
</ul>
</li>
<li><p>使用说明：Lambda表达式被类方法替代的时候，它的形式参数全部传递给静态方法作为参数。</p>
</li>
</ul>
</li>
</ul>
<h3 id="16-引用对象的实例方法"><a href="#16-引用对象的实例方法" class="headerlink" title="16_引用对象的实例方法"></a>16_引用对象的实例方法</h3><ul>
<li><p>引用对象的实例方法，其实就引用类中的成员方法。</p>
<ul>
<li>格式：对象::成员方法</li>
<li>范例：”HelloWorld”::toUpperCase</li>
<li>String类中的方法：public String toUpperCase() 将此String所有字符转换为大写。</li>
</ul>
</li>
<li><p>练习描述：</p>
<ul>
<li>定义一个类(PrintString)，里面定义一个方法。</li>
<li>public void printUpper(String s)：把字符串参数变成大写的数据，然后在控制台输出。</li>
<li><p>定义一个接口(Printer)，里面定义一个抽象方法。</p>
<ul>
<li>void printUpperCase(String s)</li>
</ul>
</li>
<li><p>定义一个测试类(PrinterDemo)，在测试类中提供两个方法。</p>
<ul>
<li>一个方法是：usePrinter(Printer p)</li>
</ul>
</li>
<li><p>一个方法是主方法，在主方法中调用usePrinter方法。</p>
</li>
</ul>
</li>
<li><p>使用说明：Lambda表达式被对象的实例方法替代的时候，它的形式参数全部传递给该方法作为参数。</p>
</li>
</ul>
<h3 id="17-引用类的实例方法"><a href="#17-引用类的实例方法" class="headerlink" title="17_引用类的实例方法"></a>17_引用类的实例方法</h3><ul>
<li><p>引用类的实例方法，其实就是引用类中的成员方法。</p>
<ul>
<li>格式：类名::成员方法</li>
<li>范例：String::substring</li>
</ul>
</li>
<li><p>String类中的方法：public String substring(int beginIndex,int endIndex)</p>
</li>
<li>从beginIndex开始到endIndex结束，截取字符串。返回一个子串，子串的长度为endIndex-beginIndex。</li>
<li><p>练习描述：</p>
<ul>
<li><p>定义一个接口(MyString)，里面定义一个抽象方法：</p>
<ul>
<li>String mySubString(String s,int x,int y);</li>
</ul>
</li>
<li><p>定义一个测试类(MyStringDemo)，在测试类中提供两个方法：</p>
<ul>
<li>一个方法是：useMyString(MyString my)</li>
<li>一个方法是主方法，在主方法中调用useMyString方法</li>
</ul>
</li>
</ul>
</li>
<li><p>使用说明：Lambda表达式被类的实例方法替代的时候，第一个参数作为调用者，后面的参数全部传递给该方法作为参数。</p>
</li>
</ul>
<h3 id="18-引用构造器"><a href="#18-引用构造器" class="headerlink" title="18_引用构造器"></a>18_引用构造器</h3><ul>
<li><p>引用构造器，其实就是引用构造方法。</p>
<ul>
<li>格式：类名::new</li>
<li>范例：Student::new</li>
</ul>
</li>
<li><p>练习描述：</p>
<ul>
<li><p>定义一个类(Student)，里面有两个成员变量(name,age)</p>
<ul>
<li>并提供无参构造方法和带参构造方法，以及成员变量对应的get和set方法。</li>
</ul>
</li>
<li><p>定义一个接口(StudentBuilder)，里面定义一个抽象方法：</p>
<ul>
<li>Student build(String name,int age);</li>
</ul>
</li>
<li><p>定义一个测试类(StudentDemo)，在测试类中提供两个方法：</p>
<ul>
<li>一个方法是：useStudentBuilder(StudentBuilder s)</li>
<li>一个方法是主方法，在主方法中调用useStudentBuilder方法</li>
</ul>
</li>
</ul>
</li>
<li><p>使用说明：Lambda表达式被构造器替代的时候，它的形式参数全部传递给构造器作为参数。</p>
</li>
</ul>

      
    </div>
    <footer class="article-footer">
      <a data-url="https://goofyer.gitee.io/notes-on-computer-expertise/2021/12/20/Java/%E7%AC%AC%E5%8D%81%E7%AB%A0%20Lambda%E8%A1%A8%E8%BE%BE%E5%BC%8F/" data-id="cl403sxrf001zf8vu831c987v" data-title="" class="article-share-link">Share</a>
      
      
      
    </footer>
  </div>
  
    
<nav id="article-nav">
  
    <a href="/notes-on-computer-expertise/2021/12/20/Java/%E7%AC%AC%E5%8D%81%E4%B8%80%E7%AB%A0%E5%87%BD%E6%95%B0%E5%BC%8F%E6%8E%A5%E5%8F%A3/" id="article-nav-newer" class="article-nav-link-wrap">
      <strong class="article-nav-caption">Newer</strong>
      <div class="article-nav-title">
        
          (no title)
        
      </div>
    </a>
  
  
    <a href="/notes-on-computer-expertise/2021/12/20/Java/%E7%AC%AC%E4%B9%9D%E7%AB%A0%20java%E4%B8%8E%E7%BD%91%E7%BB%9C%E7%BC%96%E7%A8%8B/" id="article-nav-older" class="article-nav-link-wrap">
      <strong class="article-nav-caption">Older</strong>
      <div class="article-nav-title"></div>
    </a>
  
</nav>

  
</article>


</section>
        
          <aside id="sidebar">
  
    
  <div class="widget-wrap">
    <h3 class="widget-title">Categories</h3>
    <div class="widget">
      <ul class="category-list"><li class="category-list-item"><a class="category-list-link" href="/notes-on-computer-expertise/categories/C-%E5%B7%A5%E5%85%B7/">C#工具</a></li><li class="category-list-item"><a class="category-list-link" href="/notes-on-computer-expertise/categories/C-%E5%B7%A5%E5%85%B7/">C++工具</a></li><li class="category-list-item"><a class="category-list-link" href="/notes-on-computer-expertise/categories/Mysql/">Mysql</a></li><li class="category-list-item"><a class="category-list-link" href="/notes-on-computer-expertise/categories/blender/">blender</a></li><li class="category-list-item"><a class="category-list-link" href="/notes-on-computer-expertise/categories/linux/">linux</a></li><li class="category-list-item"><a class="category-list-link" href="/notes-on-computer-expertise/categories/manim/">manim</a></li><li class="category-list-item"><a class="category-list-link" href="/notes-on-computer-expertise/categories/spring/">spring</a></li><li class="category-list-item"><a class="category-list-link" href="/notes-on-computer-expertise/categories/vba%E5%9F%BA%E7%A1%80%E6%93%8D%E4%BD%9C/">vba基础操作</a></li><li class="category-list-item"><a class="category-list-link" href="/notes-on-computer-expertise/categories/%E5%88%9B%E9%80%A0%E6%A8%A1%E5%BC%8F/">创造模式</a></li><li class="category-list-item"><a class="category-list-link" href="/notes-on-computer-expertise/categories/%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F/">操作系统</a></li><li class="category-list-item"><a class="category-list-link" href="/notes-on-computer-expertise/categories/%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F%E5%9F%BA%E7%A1%80%E7%9F%A5%E8%AF%86/">操作系统基础知识</a></li><li class="category-list-item"><a class="category-list-link" href="/notes-on-computer-expertise/categories/%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F%E5%BC%80%E5%8F%91/">操作系统开发</a></li><li class="category-list-item"><a class="category-list-link" href="/notes-on-computer-expertise/categories/%E6%95%B0%E5%AD%A6/">数学</a></li><li class="category-list-item"><a class="category-list-link" href="/notes-on-computer-expertise/categories/%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84/">数据结构</a></li><li class="category-list-item"><a class="category-list-link" href="/notes-on-computer-expertise/categories/%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84%E5%9F%BA%E7%A1%80%E7%9F%A5%E8%AF%86/">数据结构基础知识</a></li><li class="category-list-item"><a class="category-list-link" href="/notes-on-computer-expertise/categories/%E6%A8%A1%E6%9D%BF/">模板</a></li><li class="category-list-item"><a class="category-list-link" href="/notes-on-computer-expertise/categories/%E6%B7%B1%E5%BA%A6%E5%AD%A6%E4%B9%A0/">深度学习</a></li><li class="category-list-item"><a class="category-list-link" href="/notes-on-computer-expertise/categories/%E8%8B%B1%E8%AF%AD/">英语</a></li><li class="category-list-item"><a class="category-list-link" href="/notes-on-computer-expertise/categories/%E8%99%9A%E5%B9%BB4/">虚幻4</a></li><li class="category-list-item"><a class="category-list-link" href="/notes-on-computer-expertise/categories/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BB%84%E6%88%90%E5%8E%9F%E7%90%86/">计算机组成原理</a></li><li class="category-list-item"><a class="category-list-link" href="/notes-on-computer-expertise/categories/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BD%91%E7%BB%9C/">计算机网络</a></li></ul>
    </div>
  </div>


  
    
  <div class="widget-wrap">
    <h3 class="widget-title">Tags</h3>
    <div class="widget">
      <ul class="tag-list" itemprop="keywords"><li class="tag-list-item"><a class="tag-list-link" href="/notes-on-computer-expertise/tags/C/" rel="tag">C++</a></li></ul>
    </div>
  </div>


  
    
  <div class="widget-wrap">
    <h3 class="widget-title">Tag Cloud</h3>
    <div class="widget tagcloud">
      <a href="/notes-on-computer-expertise/tags/C/" style="font-size: 10px;">C++</a>
    </div>
  </div>

  
    
  <div class="widget-wrap">
    <h3 class="widget-title">Archives</h3>
    <div class="widget">
      <ul class="archive-list"><li class="archive-list-item"><a class="archive-list-link" href="/notes-on-computer-expertise/archives/2022/05/">May 2022</a></li><li class="archive-list-item"><a class="archive-list-link" href="/notes-on-computer-expertise/archives/2022/03/">March 2022</a></li><li class="archive-list-item"><a class="archive-list-link" href="/notes-on-computer-expertise/archives/2022/02/">February 2022</a></li><li class="archive-list-item"><a class="archive-list-link" href="/notes-on-computer-expertise/archives/2022/01/">January 2022</a></li><li class="archive-list-item"><a class="archive-list-link" href="/notes-on-computer-expertise/archives/2021/12/">December 2021</a></li></ul>
    </div>
  </div>


  
    
  <div class="widget-wrap">
    <h3 class="widget-title">Recent Posts</h3>
    <div class="widget">
      <ul>
        
          <li>
            <a href="/notes-on-computer-expertise/2022/05/31/vue/%E5%89%8D%E7%AB%AF%E6%A1%86%E6%9E%B6%E9%AA%8C%E8%AF%81%E7%A0%81%E6%97%A0%E6%B3%95%E6%98%BE%E7%A4%BA/">(no title)</a>
          </li>
        
          <li>
            <a href="/notes-on-computer-expertise/2022/05/26/%E6%95%B0%E6%8D%AE%E5%BA%93/navicat%E5%AE%89%E8%A3%85/">(no title)</a>
          </li>
        
          <li>
            <a href="/notes-on-computer-expertise/2022/05/25/%E8%99%9A%E5%B9%BB4%E5%BC%95%E6%93%8E%E5%BC%80%E5%8F%91/%E8%99%9A%E5%B9%BB%E5%9B%9B%20mod%E5%88%B6%E4%BD%9C/">(no title)</a>
          </li>
        
          <li>
            <a href="/notes-on-computer-expertise/2022/05/23/python/python%E6%89%B9%E9%87%8F%E7%94%9F%E6%88%90%E6%95%B0%E6%8D%AE/">(no title)</a>
          </li>
        
          <li>
            <a href="/notes-on-computer-expertise/2022/05/23/vba%E5%9F%BA%E7%A1%80%E6%93%8D%E4%BD%9C%E7%AC%94%E8%AE%B0/EXCEL%E5%9F%BA%E7%A1%80%E6%95%99%E7%A8%8B/">(no title)</a>
          </li>
        
      </ul>
    </div>
  </div>

  
</aside>
        
      </div>
      <footer id="footer">
  
  <div class="outer">
    <div id="footer-info" class="inner">
      
      &copy; 2022 John Doe<br>
      Powered by <a href="https://hexo.io/" target="_blank">Hexo</a>
    </div>
  </div>
</footer>

    </div>
    <nav id="mobile-nav">
  
    <a href="/notes-on-computer-expertise/" class="mobile-nav-link">Home</a>
  
    <a href="/notes-on-computer-expertise/archives" class="mobile-nav-link">Archives</a>
  
</nav>
    


<script src="/notes-on-computer-expertise/js/jquery-3.4.1.min.js"></script>



  
<script src="/notes-on-computer-expertise/fancybox/jquery.fancybox.min.js"></script>




<script src="/notes-on-computer-expertise/js/script.js"></script>





  </div>
<script type="text/x-mathjax-config">
    MathJax.Hub.Config({
        tex2jax: {
            inlineMath: [ ["$","$"], ["\\(","\\)"] ],
            skipTags: ['script', 'noscript', 'style', 'textarea', 'pre', 'code'],
            processEscapes: true
        }
    });
    MathJax.Hub.Queue(function() {
        var all = MathJax.Hub.getAllJax();
        for (var i = 0; i < all.length; ++i)
            all[i].SourceElement().parentNode.className += ' has-jax';
    });
</script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.1/MathJax.js?config=TeX-MML-AM_CHTML"></script>
</body>
</html>